home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Games / NetHack 3.1.3 / source / sys / mac / maccurs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-01  |  6.0 KB  |  319 lines  |  [TEXT/R*ch]

  1. /*    SCCS Id: @(#)maccurs.c    3.1    93/01/24          */
  2. /* Copyright (c) Jon W{tte, 1992.                  */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. #include "hack.h"
  6.  
  7. #include <Folders.h>
  8. #include <Windows.h>
  9. #include <ToolUtils.h>
  10. #include <Resources.h>
  11. #include <Memory.h>
  12. #include <Files.h>
  13.  
  14. extern void dprintf ( char * , ... ) ;
  15.  
  16. #define DIV_FACTOR 3
  17.  
  18. static Boolean winFileInit = 0 ;
  19. static unsigned char winFileName [ 32 ] ;
  20. static long winFileDir ;
  21. static short winFileVol ;
  22. static Handle winFileContents = (Handle) NULL ;
  23.  
  24. typedef struct WinPosSave {
  25.     short            validPos ;
  26.     short            validSize ;
  27.     short            top ;
  28.     short            left ;
  29.     short            height ;
  30.     short            width ;
  31. } WinPosSave ;
  32.  
  33. static WinPosSave savePos [ kLastWindowKind + 1 ] ;
  34. static WinPosSave usePos [ kLastWindowKind + 1 ] ;
  35.  
  36.  
  37.  
  38. static void
  39. InitWinFile ( void )
  40. {
  41.     StringHandle sh ;
  42.     long len ;
  43.     short ref = 0 ;
  44.  
  45.     if ( winFileInit ) {
  46.         return ;
  47.     }
  48. /* We trust the glue. If there's an error, store in game dir. */
  49.     if ( FindFolder ( kOnSystemDisk , kPreferencesFolderType , kCreateFolder ,
  50.         & winFileVol , & winFileDir ) ) {
  51.         winFileVol = 0 ;
  52.         winFileDir = 0 ;
  53.     }
  54.     sh = GetString ( 128 ) ;
  55.     if ( sh && * sh ) {
  56.         BlockMove ( * sh , winFileName , * * sh + 1 ) ;
  57.         ReleaseResource ( (Handle) sh ) ;
  58.     } else {
  59.         BlockMove ( "\PNetHack Windows" , winFileName , 16 ) ;
  60.     }
  61.     if ( HOpen ( winFileVol , winFileDir , winFileName , fsRdPerm , & ref ) ) {
  62.         return ;
  63.     }
  64.     len = sizeof ( savePos ) ;
  65.     if ( ! FSRead ( ref , & len , savePos ) ) {
  66.         winFileInit = 1 ;
  67.     }
  68.     BlockMove ( savePos , usePos , sizeof ( savePos ) ) ;
  69.     FSClose ( ref ) ;
  70. }
  71.  
  72.  
  73. static void
  74. FlushWinFile ( void )
  75. {
  76.     short ref ;
  77.     long len ;
  78.  
  79.     if ( ! winFileInit ) {
  80.         if ( ! winFileName [ 0 ] ) {
  81.             return ;
  82.         }
  83.         HCreate ( winFileVol , winFileDir , winFileName , MAC_CREATOR , PREF_TYPE ) ;
  84.         HCreateResFile ( winFileVol , winFileDir , winFileName ) ;
  85.     }
  86.     if ( HOpen ( winFileVol , winFileDir , winFileName , fsWrPerm , & ref ) ) {
  87.         return ;
  88.     }
  89.     winFileInit = 1 ;
  90.     len = sizeof ( savePos ) ;
  91.     ( void ) FSWrite ( ref , & len , savePos ) ; /* Don't care about error */
  92.     FSClose ( ref ) ;
  93. }
  94.  
  95.  
  96. #if 0
  97. /* Now we use click_to_cmd() instead. */
  98.  
  99. int
  100. clickSector ( int x , int y , int toX , int toY )
  101. {
  102.     Boolean isDown = 0 ;
  103.     Boolean isLeft = 0 ;
  104.     Boolean inHoriz = 0 ;
  105.     Boolean inVert = 0 ;
  106.  
  107.     if ( toX == x && toY == y ) {
  108.  
  109.         return 0 ; /* On the same spot */
  110.     }
  111.  
  112.     if ( abs ( toY - y ) <= abs ( toX - x ) / DIV_FACTOR ) {
  113.  
  114.         inHoriz = 1 ;
  115.     }
  116.     if ( abs ( toX - x ) <= abs ( toY - y ) / DIV_FACTOR ) {
  117.  
  118.         inVert = 1 ;
  119.     }
  120.     if ( toY > y ) {
  121.  
  122.         isDown = 1 ;
  123.     }
  124.     if ( toX < x ) {
  125.  
  126.         isLeft = 1 ;
  127.     }
  128.  
  129.     if ( inHoriz ) {
  130.  
  131.         if ( isLeft ) {
  132.  
  133.             return 7 ;
  134.         }
  135.         return 3 ;
  136.     }
  137.     if ( inVert ) {
  138.  
  139.         if ( isDown ) {
  140.  
  141.             return 5 ;
  142.         }
  143.         return 1 ;
  144.     }
  145.     if ( isDown ) {
  146.  
  147.         if ( isLeft ) {
  148.  
  149.             return 6 ;
  150.         }
  151.         return 4 ;
  152.  
  153.     } else {
  154.  
  155.         if ( isLeft ) {
  156.  
  157.             return 8 ;
  158.         }
  159.         return 2 ;
  160.     }
  161. }
  162.  
  163. #endif
  164.  
  165.  
  166. Boolean
  167. RetrievePosition ( short kind , short * top , short * left ) {
  168. Point p ;
  169.  
  170.     InitWinFile ( ) ;
  171.     if ( kind < 0 || kind > kLastWindowKind ) {
  172.         dprintf ( "Retrieve Bad kind %d" , kind ) ;
  173.         return 0 ;
  174.     }
  175.     if ( ! usePos [ kind ] . validPos ) {
  176.         dprintf ( "Retrieve Not stored kind %d" , kind ) ;
  177.         return 0 ;
  178.     }
  179.     * top = usePos [ kind ] . top ;
  180.     * left = usePos [ kind ] . left ;
  181.     p . h = * left ;
  182.     p . v = * top ;
  183.     dprintf ( "Retrieve Kind %d Point (%d,%d)" , kind , * left , * top ) ;
  184.     return PtInRgn ( p , GetGrayRgn ( ) ) ;
  185. }
  186.  
  187.  
  188. Boolean
  189. RetrieveSize ( short kind , short top , short left , short * height , short * width )
  190. {
  191.     Point p ;
  192.  
  193.     InitWinFile ( ) ;
  194.     if ( kind < 0 || kind > kLastWindowKind ) {
  195.         return 0 ;
  196.     }
  197.     if ( ! usePos [ kind ] . validSize ) {
  198.         return 0 ;
  199.     }
  200.     * width = usePos [ kind ] . width ;
  201.     * height = usePos [ kind ] . height ;
  202.     p . h = left + * width ;
  203.     p . v = top + * height ;
  204.     return PtInRgn ( p , GetGrayRgn ( ) ) ;
  205. }
  206.  
  207.  
  208. void
  209. SavePosition ( short kind , short top , short left )
  210. {
  211.     InitWinFile ( ) ;
  212.     if ( kind < 0 || kind > kLastWindowKind ) {
  213.         dprintf ( "Save bad kind %d" , kind ) ;
  214.         return ;
  215.     }
  216.     savePos [ kind ] . validPos = 1 ;
  217.     savePos [ kind ] . top = top ;
  218.     savePos [ kind ] . left = left ;
  219.     dprintf ( "Save kind %d point (%d,%d)" , kind , left , top ) ;
  220.     FlushWinFile ( ) ;
  221. }
  222.  
  223.  
  224. void
  225. SaveSize ( short kind , short height , short width )
  226. {
  227.     InitWinFile ( ) ;
  228.     if ( kind < 0 || kind > kLastWindowKind ) {
  229.         return ;
  230.     }
  231.     savePos [ kind ] . validSize = 1 ;
  232.     savePos [ kind ] . width = width ;
  233.     savePos [ kind ] . height = height ;
  234.     FlushWinFile ( ) ;
  235. }
  236.  
  237.  
  238. static short
  239. GetWinKind ( WindowPtr win )
  240. {
  241. short kind ;
  242. NhWindow * nhw = GetNhWin ( win ) ;
  243. char * typeStr [ ] = {
  244.     "map" , "status" , "message" , "text" , "menu" ,
  245. } ;
  246.  
  247.     if ( ! nhw || ( ( ( long ) nhw ) & 1 ) || nhw -> theWindow != win ) {
  248.         return -1 ;
  249.     }
  250.     kind = nhw -> kind ;
  251.     if ( kind < 0 || kind > NHW_TEXT ) {
  252.         return -1 ;
  253.     }
  254.     dprintf ( "Got window kind %d (%lx)->%lx" , kind , win , nhw ) ;
  255.     switch ( kind ) {
  256.     case NHW_MAP :
  257.     case NHW_STATUS :
  258.     case NHW_BASE :
  259.         kind = kMapWindow ;
  260.         break ;
  261.     case NHW_MESSAGE :
  262.         kind = kMessageWindow ;
  263.         break ;
  264.     case NHW_MENU :
  265.         kind = kMenuWindow ;
  266.         break ;
  267.     default :
  268.         kind = kTextWindow ;
  269.         break ;
  270.     }
  271.     dprintf ( "Returning kind %s" , typeStr [ kind ] ) ;
  272.     return kind ;
  273. }
  274.  
  275.  
  276. Boolean
  277. RetrieveWinPos ( WindowPtr win , short * top , short * left )
  278. {
  279.     short kind ;
  280.  
  281.     kind = GetWinKind ( win ) ;
  282.     if ( kind < 0 || kind > kLastWindowKind ) {
  283.         return 0 ;
  284.     }
  285.     return RetrievePosition ( kind , top , left ) ;
  286. }
  287.  
  288.  
  289. void
  290. SaveWindowPos ( WindowPtr win )
  291. {
  292.     short kind ;
  293.     GrafPtr gp ;
  294.     Point p = { 0 , 0 } ;
  295.  
  296.     kind = GetWinKind ( win ) ;
  297.     if ( kind < 0 || kind > kLastWindowKind ) {
  298.         return ;
  299.     }
  300.     GetPort ( & gp ) ;
  301.     SetPort ( win ) ;
  302.     LocalToGlobal ( & p ) ;
  303.     AddPt ( * ( Point * ) & ( win -> portRect ) , & p ) ; /* Adjust for origin */
  304.     SetPort ( gp ) ;
  305.     SavePosition ( kind , p . v , p . h ) ;
  306. }
  307.  
  308.  
  309. void
  310. SaveWindowSize ( WindowPtr win )
  311. {
  312.     short kind , width , height ;
  313.  
  314.     kind = GetWinKind ( win ) ;
  315.     width = win -> portRect . right - win -> portRect . left ;
  316.     height = win -> portRect . bottom - win -> portRect . top ;
  317.     SaveSize ( kind , height , width ) ;
  318. }
  319.